
#类
class Student:
    #类属性
    school= '清华大学'
    #初始化方法
    #实例属性--定义在__init__方法中，使用self.属性名=属性值 局部变量
    def __init__(self,xm,age):#self是实例对象，xm和age是方法的参数，是局部变量，只在方法内部有效
        self.name=xm #左侧是实例属性，xm是局部变量，将局部变量赋值给实例属性
        self.age=age #实例的名称和局部变·量的名称可以相同

    #实例方法--定义在类中，第一个参数是self，代表实例对象
    def show(self):
        print('姓名：',self.name)
        print('年龄：',self.age)
        print('学校：',self.school)

    #静态方法--定义在类中，使用@staticmethod装饰器修饰，不需要self参数
    @staticmethod
    def show1():
        #self.name #静态方法中不能访问实例属性
        #self.show() #静态方法中不能访问实例方法
        print('这是一个静态方法,不能访问实例属性、方法和类属性')#静态方法中不能访问实例属性和类属性

    #类方法--定义在类中，使用@classmethod装饰器修饰，第一个参数是cls，代表类对象
    @classmethod
    def show2(cls): #cls是类对象,代表类本身 cls-->class
        print('这是一个类方法,不能访问实例属性和方法')
        #print(self.name) #类方法中不能访问实例属性
        #self.show() #类方法中不能访问实例方法
        print('学校：',cls.school) #可以访问类属性和其他类方法
        #比如：cls.show1() #类方法中可以调用静态方法

#创建实例
stu=Student('张三',20) #stu是Student类的实例,xm和age是实例属性
#实例属性,使用对象名.属性名访问
print(stu.name,stu.age) #实例属性

#类属性，直接使用类名访问
print(Student.school) #类属性

#实例方法，使用对象名.方法名()调用
stu.show() #实例方法

#类方法，@classmethod修饰的方法，使用类名.方法名()调用
Student.show2()

#静态方法，@staticmethod修饰的方法，使用类名.方法名()调用
Student.show1()



#创建多个类对象-学生，遍历读取名字年龄
stu1=Student('李四',21)
stu2=Student('王五',22)
stu3=Student('赵六',23)

print(type(stu1))
print(type(stu2))
print(type(stu3))

Student.school='中国教育' #修改类属性

#存储列表
students=[stu1,stu2,stu3]
#遍历列表
for s in students:
    s.show() #调用实例方法

